home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / cug202 / karel1.c < prev    next >
Text File  |  1979-12-31  |  22KB  |  684 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. #define CURPOS      '\033'      /* ESC */
  5. #define ERROR       -1          /* error flag */
  6. #define MAXLINE     150         /* longest input line */
  7. #define NSECTS      8           /* number of sectors */
  8. #define SECSIZ      128         /* sector size */
  9. #define CPMEOF      0x1A        /* end of file for op system */
  10. #define BRACKET     '['
  11. #define LETTERH     'H'
  12. #define SEMI        ';'
  13. #define TWO         '2'
  14. #define LETTERJ     'J'
  15.  
  16. char world[23][75];             /* array for Karel's world */
  17. int bag;                        /* Karel's beeper bag */
  18. int kst;                        /* Karel's street */
  19. int kav;                        /* Karel's avenue */
  20. char kdir;                      /* Karel's direction */
  21. int last;                       /* next loc in sym table */
  22.  
  23. main(argc,argv)
  24. int argc;                       /* number of arguments for main */
  25. char **argv;                    /* arg vector */
  26. {
  27.           char ans;
  28.           FILE *fileptr;
  29.           int speed;
  30.  
  31.           if (argc < 3)
  32.              printf("MISSING FILENAME(S)\n");
  33.           else {
  34.              if ((fileptr = fopen(argv[2],"r")) != NULL) {
  35.                 readworld(fileptr);
  36.                 printworld();
  37.              } else { 
  38.                   initworld(); 
  39.                   printworld();
  40.                }
  41.              fclose(fileptr);
  42.              set_curs(25,0,0,"CHANGE KAREL'S LOCATION? (Y/N)");
  43.              if ((ans = upper(getchr())) != 'N')
  44.                 kareloc();
  45.              set_curs(25,0,75,"CHANGE BEEPERS IN WORLD? (Y/N)");
  46.              if ((ans = upper(getchr())) != 'N')
  47.                 beeploc();
  48.              set_curs(25,0,75,"CHANGE BEEPERS IN BAG? (Y/N)");
  49.              if ((ans = upper(getchr())) != 'N')
  50.                 bagloc();
  51.              set_curs(25,0,75,"CHANGE WALL LOCATIONS? (Y/N)");
  52.              if ((ans = upper(getchr())) != 'N')
  53.                 wallsloc();
  54.              alterations();
  55.              set_curs(25,0,75,"EXECUTE PROGRAM? (Y/N)");
  56.              if ((ans = upper(getchr())) != 'Y') {
  57.                 set_curs(25,0,75,"EXIT KAREL? (Y/N)");
  58.                 if ((ans = upper(getchr())) != 'N')
  59.                    exit();
  60.              }
  61.              saveworld(argv,fileptr);
  62.              do {
  63.                 set_curs(25,0,75,"KAREL'S SPEED? (1,2,3)");
  64.                 speed = getint();
  65.              } while (speed != 1 && speed != 2 && speed != 3);
  66.              createpgm(argv,speed);
  67.           }
  68. }
  69.  
  70.  
  71. char upper(c)
  72. char c;
  73. {
  74.      return islower(c) ? c-32 : c;
  75. }
  76.  
  77. initworld()   /* initialize "empty world" */
  78. {
  79.           int i,j;
  80.           char c;
  81.  
  82.           kst = 21;                          /* init Karel's st */
  83.           kav = 4;                          /* init Karel's ave */
  84.           kdir = '0';                       /* init Karel's dir */
  85.  
  86.           for (i = 0; i < 23; i++)
  87.             for (j = 0; j < 75; j++)         /* blank out array */
  88.               world[i][j] = ' ';
  89.  
  90.           for (i = 1; i < 21; i+=2)
  91.             for (j = 8; j < 75; j += 4)
  92.               world[i][j] = '.';                     /* corners */
  93.  
  94.           for (i = 0; i < 20; i++) {
  95.             world[i][6] = '|';            /* left edge of world */
  96.             world[i][74] = '|';          /* right edge of world */
  97.           }
  98.           for (j = 6; j < 75; j++) {
  99.             world[20][j] = '-';          /* lower edge of world */
  100.             world[0][j] = '-';           /* upper edge of world */
  101.           }
  102.  
  103.           world[1][0] = 'S';            world[22][66] = 'A';
  104.           world[2][0] = 'T';            world[22][67] = 'V';
  105.           world[3][0] = 'R';            world[22][68] = 'E';
  106.           world[4][0] = 'E';            world[22][69] = 'N';
  107.           world[5][0] = 'E';            world[22][70] = 'U';
  108.           world[6][0] = 'T';            world[22][71] = 'E';
  109.           world[7][0] = 'S';            world[22][72] = 'S';
  110.  
  111.           world[1][3] = '1';  world[1][4] = '0';
  112.           for (i = 3, c = '9'; i < 21; i += 2, c--)
  113.             world[i][4] = c;                  /* number streets */
  114.  
  115.           for (j = 8, c = '1'; j < 75; j += 4, c++) {
  116.             world[21][j] = c;                 /* number avenues */
  117.             if (c > '9') {
  118.                 world[21][--j] = '1';
  119.                 world[21][++j] = c - 10;
  120.             }
  121.           }
  122. }
  123.  
  124. readworld(fptr)    /* input values from old world file */
  125. FILE *fptr;
  126. {
  127.           int i,j;
  128.  
  129.           fscanf(fptr,"%d %d %d",&kst,&kav,&bag);
  130.           kdir = getc(fptr);
  131.           for (i = 0; i < 23; i++)
  132.             for (j = 0; j < 75; j++)
  133.               world[i][j] = getc(fptr);
  134. }
  135.  
  136.  
  137. printworld()    /* output values stored in world array */
  138. {
  139.           int i,j,kst2,kav2;
  140.  
  141.           printf("%c%c%c%c",CURPOS,BRACKET,TWO,LETTERJ);
  142.           for (i = 0; i < 23; i++) {
  143.            set_curs(i+1,1,0,"");
  144.             for (j = 0; j < 75; j++) {
  145.               printf("%c",world[i][j]);
  146.             }
  147.           }
  148.           set_curs(25,37,0,"");
  149.           kst2 = (21 - kst)/2;
  150.           kav2 = (kav - 4)/4;
  151.           printf("KAREL'S ST= %d  AVE= %d  DIR= %c BAG= %d",
  152.                         kst2,kav2,kdir,bag);
  153. }
  154.  
  155.  
  156. kareloc()/* determine street, avenue and direction for KAREL */
  157. {
  158.           char ans,k;
  159.  
  160.           k = world[kst][kav];
  161.           do {
  162.              if (kst != 0 && (k == '^' || k == 'V' || 
  163.                               k == '>' || k == '<')) {
  164.                 world[kst][kav] = '.';
  165.                 set_curs(kst+1,kav+1,1,".");
  166.              }
  167.              do {
  168.                 set_curs(25,0,75,"KAREL'S STREET?");
  169.                 kst = getint();
  170.              } while (kst == 0 || kst > 10);
  171.              do {
  172.                 set_curs(25,0,75,"KAREL'S AVENUE?");
  173.                 kav  = getint();
  174.              } while (kav == 0 || kav > 17);
  175.              kst = 21 - 2 * kst;
  176.              kav = 4 + 4 * kav;
  177.              set_curs(25,0,75,"DIRECTION? (N/S/E/W)");
  178.              kdir = upper(getchr());
  179.              storekarel();
  180.              set_curs(kst+1,kav+1,1,"");
  181.              printf("%c",kdir);
  182.              set_curs(25,0,75,"IS KAREL'S LOCATION CORRECT? (Y/N)");
  183.              if ((ans = upper(getchr())) != 'Y') {
  184.                 set_curs(kst+1,kav+1,1,"");
  185.                 printf("%c", world[kst][kav]);
  186.              }
  187.          } while (ans != 'Y');
  188.          if (world[kst][kav] == '.')
  189.             world[kst][kav] = kdir;
  190. }
  191.  
  192.  
  193. storekarel()   /* determine KAREL's direction from console input */
  194. {           
  195.              char k;
  196.  
  197.              switch(kdir) {
  198.              case 'N':
  199.                 kdir = '^';
  200.                 break;
  201.              case 'S':
  202.                 kdir = 'V';
  203.                 break;
  204.              case 'E':
  205.                 kdir = '>';
  206.                 break;
  207.              case 'W':
  208.              default:
  209.                 kdir = '<';
  210.              }  
  211. }
  212.  
  213.  
  214.  
  215. beeploc()  /* determine beeper locations */
  216. {
  217.           int bst,bav,valid;
  218.           char ans;
  219.  
  220.           ans = 'Y';
  221.           while (ans != 'N') {
  222.              do {
  223.                 set_curs(25,0,75,"STREET?");
  224.                 bst = getint();
  225.              } while (bst == 0 || bst > 10);
  226.              do {
  227.                 set_curs(25,0,75,"AVENUE?");
  228.                 bav = getint();
  229.              } while (bav == 0 || bav > 17);
  230.              bst = 21 - 2 * bst;
  231.              bav = 4 + 4 * bav;
  232.              set_curs(25,0,75,"TYPE A TO ADD OR D TO DELETE BEEPER");
  233.              if ((ans = upper(getchr())) != 'D') { 
  234.                 valid = putbeeper(bst,bav);
  235.                 if (valid) {
  236.                    set_curs(bst+1,bav+1,1,"");
  237.                    printf("%c",world[bst][bav]);
  238.                    set_curs(25,0,75,"IS BEEPER LOCATION CORRECT?(Y/N)");
  239.                    if ((ans = upper(getchr())) != 'Y') {
  240.                       pickbeeper(bst,bav);
  241.                       set_curs(bst+1,bav+1,1,"");
  242.                       printf("%c",world[bst][bav]);
  243.                    }
  244.                 }
  245.              } else {
  246.                   pickbeeper(bst,bav);
  247.                   set_curs(bst+1,bav+1,1,"");
  248.                   printf("%c",world[bst][bav]);
  249.                }
  250.             set_curs(25,0,75,"OTHER BEEPER LOCATIONS? (Y/N)");
  251.             ans = upper(getchr());
  252.          } 
  253.         
  254. }
  255.  
  256.  
  257. bagloc() /* determine number of beepers in beeper bag */
  258. {
  259.           char ans;
  260.  
  261.           do {
  262.              set_curs(25,0,75,"HOW MANY BEEPERS IN BEEPER BAG?");
  263.              bag = getint();
  264.              set_curs(25,0,75,"");
  265.              printf("%d BEEPERS IN BAG, CORRECT? (Y/N)",bag);
  266.           } while ((ans = upper(getchr())) != 'Y');
  267. }
  268.  
  269.  
  270. putbeeper(bst,bav) /* place one beeper in the world */
  271. int bst,bav;       /* at bst street and bav avenue  */
  272. {
  273.           char k;
  274.  
  275.           k = world[bst][bav];
  276.           if (k == '9') {
  277.              set_curs(25,0,75,"NO MORE THAN 9 BEEPERS ON A CORNER.");
  278.              set_curs(25,36,0,"TYPE ANY CHARACTER TO CONTINUE");
  279.              getchr();
  280.              return (0);
  281.           } else {
  282.                if (k == '.' || k == '^' || k == 'V' ||
  283.                                k == '>' || k == '<')
  284.                   k = '@';
  285.                else if (k == '@')
  286.                        k = '2';
  287.                else ++k;
  288.                world[bst][bav] = k;
  289.                return(1);
  290.             }
  291. }
  292.  
  293.  
  294. pickbeeper(bst,bav)  /* remove one beeper from the world   */
  295. int bst,bav;         /* location bst street and bav avenue */
  296. {
  297.           char k;
  298.           
  299.           k = world[bst][bav];
  300.           if (k == '.' || k == '^' || k == 'V' ||
  301.                           k == '<' || k == '>') {
  302.              set_curs(25,0,75,"NO BEEPER ON CORNER.");
  303.              set_curs(25,21,0,"TYPE ANY CHARACTER TO CONTINUE.");
  304.              getchr();
  305.           } else {
  306.                if (bst == kst && bav == kav && k == '@')
  307.                   k = kdir;
  308.                else if (k == '2')
  309.                         k = '@';
  310.                else if (k != '@')
  311.                        --k;
  312.                else k = '.';
  313.                world[bst][bav] = k;
  314.             }
  315. }
  316.  
  317.  
  318. wallsloc()   /* determine wall location(s) */
  319. {
  320.           int i,j,s1,s2,st1,st2,a1,a2,av1,av2,horiz;
  321.           char ans;
  322.  
  323.           do {
  324.              do {
  325.                 set_curs(25,0,75,"BETWEEN WHAT STREETS?");
  326.                 s1 = getint();
  327.                 set_curs(25,0,40,"?");
  328.                 s2 = getint();
  329.              } while (s1 < 0 || s2 < 0 || s1 > 11 || s2 > 11);
  330.              st1 = min(s1,s2);
  331.              st2 = max(s1,s2);
  332.              horiz = abs(st2 - st1);
  333.              st1 = 20 - 2 * st1;
  334.              st2 = 22 - 2 * st2;
  335.              do {
  336.                 set_curs(25,0,40,"BETWEEN WHAT AVENUES?");
  337.                 a1 = getint();
  338.                 set_curs(25,0,40,"?");
  339.                 a2 = getint();
  340.              } while (a1 < 0 || a2 < 0 || a1 > 18 || a2 > 18);
  341.              av1 = min(a1,a2);
  342.              av2 = max(a1,a2);
  343.              av1 = 6 + 4 * av1;
  344.              av2 = 2 + 4 * av2;
  345.              set_curs(25,0,75,"TYPE A TO ADD OR D TO DELETE THE WALL.");
  346.              if ((ans = upper(getchr())) != 'D') {
  347.                 addwall(st1,st2,av1,av2,horiz);
  348.                 set_curs(25,0,40,"IS WALL LOCATION CORRECT? (Y/N)");
  349.                 if ((ans = upper(getchr())) != 'Y')
  350.                    erasewall(st1,st2,av1,av2,horiz);
  351.                 else {
  352.                    set_curs(25,0,40,"IS THIS THE LAST WALL? (Y/N)");
  353.                    ans = upper(getchr());
  354.                 }
  355.               } else {
  356.                    erasewall(st1,st2,av1,av2,horiz);
  357.                    set_curs(25,0,40,"IS THIS THE LAST WALL? (Y/N)");
  358.                    ans = upper(getchr());
  359.                 }
  360.           } while (ans != 'Y');
  361. }
  362.  
  363.  
  364. addwall(st1,st2,av1,av2,horiz)   /* add one wall to the world */
  365. int st1,st2,av1,av2,horiz;
  366. {
  367.            int i,j;
  368.  
  369.            if (horiz == 1)
  370.               for (j = av1; j <= av2; j++) {
  371.                   if (world[st1][j] == '|' ||
  372.                       world[st1][j] == '+')
  373.                       world[st1][j] = '+';
  374.                   else world[st1][j] = '-';       
  375.                   set_curs(st1+1,j+1,1,"");
  376.                   printf("%c",world[st1][j]);
  377.               }
  378.             else for (i = st2; i <= st1; i++) {
  379.                      if (world[i][av1] == '-' ||
  380.                          world[i][av1] == '+')
  381.                          world[i][av1] = '+';
  382.                      else world[i][av1] = '|'; 
  383.                      set_curs(i+1,av1+1,1,"");
  384.                      printf("%c",world[i][av1]);
  385.                  }
  386. }
  387.  
  388.  
  389. erasewall(st1,st2,av1,av2,horiz)  /* remove one wall from the world */
  390. int st1,st2,av1,av2,horiz;
  391.            int i,j;
  392.  
  393.            if (horiz == 1)
  394.               for (j = av1; j <= av2; j++) {
  395.                 if (j == 6 || j ==74)
  396.                    world[st1][j] = '|';
  397.                 else if (world[st1][j] == '+')
  398.                         world[st1][j] = '|';
  399.                 else world[st1][j] = ' ';
  400.                 set_curs(st1+1,j+1,1,"");
  401.                 printf("%c",world[st1][j]);
  402.               }
  403.            else for (i = st2; i <= st1; i++) {
  404.                   if (i == 0 || i == 20)
  405.                      world[i][av1] = '-';
  406.                   else if (world[i][av1] == '+')
  407.                           world[i][av1] = '-';
  408.                   else world[i][av1] = ' ';
  409.                   set_curs(i+1,av1+1,1,"");
  410.                   printf("%c",world[i][av1]);
  411.                 }
  412. }
  413.  
  414.  
  415. int atoi(n)
  416. char *n;
  417. {
  418.           int val;
  419.           char c;
  420.           int sign;
  421.           val=0;
  422.           sign=1;
  423.           while ((c = *n) == '/t' || c== ' ') ++n;
  424.           if (c== '-') {sign = -1; n++;}
  425.           while ( isdigit(c = *n++)) val = val * 10 + c - '0';
  426.           return sign*val;
  427. }
  428.  
  429. getint()  /* determine integer input from console */
  430. {
  431.           char str[5];
  432.           int in;
  433.  
  434.           inputs(str);
  435.           in = atoi(str);
  436.           return in;
  437. }
  438.  
  439.  
  440. inputs(str)   /* read string input from console */
  441. char str[];
  442. {
  443.           int j;
  444.  
  445.           j = 0;
  446.           while ((str[j++] = getchr()) != '\r')
  447.               ;
  448.           str[--j] = '\0';
  449. }
  450.  
  451.  
  452. alterations()   /* additional changes to the world */
  453.           char ans;
  454.  
  455.           set_curs(25,0,40,"ANY FURTHER CHANGES TO THE WORLD? (Y/N)");
  456.           while ((ans = upper(getchr())) != 'N') {
  457.              set_curs(25,0,40,"CHANGE KAREL'S POSITION? (Y/N)");
  458.              if ((ans = upper(getchr())) == 'Y')
  459.                 kareloc();
  460.              set_curs(25,0,40,"CHANGE BEEPERS IN WORLD? (Y/N)");
  461.              if ((ans = upper(getchr())) == 'Y')
  462.                 beeploc();
  463.              set_curs(25,0,40,"CHANGE BEEPERS IN BAG? (Y/N)");
  464.              if ((ans = upper(getchr())) == 'Y')
  465.                 bagloc();
  466.              set_curs(25,0,40,"CHANGE WALL LOCATIONS? (Y/N)");
  467.              if ((ans = upper(getchr())) == 'Y')
  468.                 wallsloc();
  469.              set_curs(25,0,40,"ANY FURTHER CHANGES TO THE WORLD? (Y/N)");
  470.           }
  471. }
  472.  
  473.  
  474. set_curs(row,col,blanks,mess) /* set cursor and print message */
  475. int row,col,blanks;
  476. char *mess;
  477. {
  478.           int j;
  479.  
  480.           printf("%c%c%d%c%d%c",CURPOS,BRACKET,row,SEMI,col,LETTERH);
  481.           for (j = 1; j <= blanks; j++)
  482.             printf(" ");        /* blank out previous message */
  483.           printf("%c%c%d%c%d%c",CURPOS,BRACKET,row,SEMI,col,LETTERH);
  484.           printf("%s", mess);   /* output current message */
  485. }
  486.  
  487.  
  488.  
  489. saveworld(argv,fptr)   /* save world array in second file */
  490. char **argv;
  491. FILE *fptr;
  492. {
  493.           int i,j;
  494.  
  495.           fptr = fopen(argv[2],"w");
  496.           fprintf(fptr,"%d %d %d",kst,kav,bag);
  497.           putc(kdir,fptr);
  498.           for (i = 0; i < 23; i++)
  499.             for (j = 0; j < 75; j++)
  500.               putc(world[i][j],fptr);
  501.           putc(CPMEOF,fptr);
  502.           fclose(fptr);
  503. }
  504.  
  505.  
  506. getchr()  /* low-level character input */
  507. {
  508.           char c;
  509.  
  510.           c = getch();
  511.           putch(c);
  512.           return c;
  513. }
  514.  
  515.  
  516.  
  517.  
  518. createpgm(argv,speed)   /* create C pgm from parse tree */
  519. char **argv;
  520. int speed;
  521. {
  522.           int i,in,d,fn,fs,b,t,l,reloc[10];
  523.           char newname[10][MAXLINE],fname[12];
  524.           char *test[19],*j[9];
  525.           FILE *fileptro,*fileptri;
  526.  
  527.           last = 0;
  528.           init(test); 
  529.           if ((fileptri = fopen(argv[1],"r")) == NULL)
  530.              printf("CAN'T FIND TREE FILE.\n");
  531.           else {
  532.              strcpy(fname,argv[1]); 
  533.              strcat(fname,".C");
  534.              if (( fileptro = fopen(fname,"w")) == NULL)
  535.                 printf("CAN'T CREATE NEW FILE.\n");
  536.              else {
  537.                 fprintf(fileptro,"#include <stdio.h>\n");
  538.                 fprintf(fileptro,"%s%d%s","#define SPEED   ",speed,"\n");
  539.                 fprintf(fileptro,"#include <karel.h>\n");
  540.                 setupspace(j);
  541.                 fprintf(fileptro,"int j1,j2,j3,j4,j5,j6,j7,j8;\n");
  542.                 fscanf(fileptri,"%d %d %d %d %d %d %d %d",&i,&in,&d,&fn,&fs,&b,&t,&l);
  543.                 fscanf(fileptri,"%d %d %d %d %d %d %d %d",&i,&in,&d,&fn,&fs,&b,&t,&l);
  544.                 while (i != 9) { /* translate to end of program */
  545.                     createline(j,i,in,d,newname,reloc,test,fileptri,fileptro);
  546.                     fscanf(fileptri,"%d %d %d %d %d %d %d %d",&i,&in,&d,&fn,&fs,&b,&t,&l);
  547.                  }
  548.                  fprintf(fileptro,"  turnoff(4);\n");
  549.                  fprintf(fileptro,"  } \n");
  550.                  putc(CPMEOF,fileptro);
  551.                  fclose(fileptri);
  552.                  fclose(fileptro);
  553.               } 
  554.           } 
  555. }
  556.  
  557. setupspace(j)      /*  initialize array of ITERATE loop counters */
  558. char *j[9];
  559. {
  560.  
  561.          char *malloc();
  562.          int i;
  563.  
  564.          for (i = 0; i <= 8; i++)
  565.               j[i] = malloc(2);
  566.          j[1] = "j1";           j[2] = "j2";
  567.          j[3] = "j3";           j[4] = "j4";
  568.          j[5] = "j5";           j[6] = "j6";
  569.          j[7] = "j7";           j[8] = "j8";
  570. }
  571.  
  572.  
  573. init(test)         /* initialize array with C version of tests */
  574. char *test[19];
  575. {
  576.  
  577.           int i;
  578.           char *malloc();
  579.  
  580. for (i = 0; i < 19; i++)        /* allocate space for tests */
  581.   test[i] = malloc(10);
  582.  
  583. test[0] = "nnorth";
  584. test[1] = "!nnorth";
  585. test[2] = "ssouth";
  586. test[3] = "!ssouth";
  587. test[4] = "eeast";
  588. test[5] = "!eeast";
  589. test[6] = "wwest";
  590. test[7] = "!wwest";
  591. test[8] = "ccorner";
  592. test[9] = "!ccorner";
  593. test[10] = "bbag";
  594. test[11] = "!bbag";
  595. test[12] = "ffront";
  596. test[13] = "!ffront";
  597. test[14] = "lleft";
  598. test[15] = "!lleft";
  599. test[16] = "rright";
  600. test[17] = "!rright";
  601. }
  602.  
  603.  
  604. createline(j,i,in,d,newname,reloc,test,fptri,fptro)
  605. int i,in,d,reloc[10];
  606. char newname[10][MAXLINE],*test[19],*j[9];
  607. FILE *fptri,*fptro;
  608. {
  609.           int k,fn,fs,b,t,l;
  610.           char w[MAXLINE];
  611.  
  612.           for (k = 0; k < (in - 1); k++)
  613.             fprintf(fptro,"  ");
  614.           if (d != 4)
  615.              switch(i) {
  616.              case 0:
  617.                 fprintf(fptro,"move();\n");
  618.                 break;
  619.              case 1:
  620.                 fprintf(fptro,"turnleft();\n");
  621.                 break;
  622.              case 2:
  623.                 fprintf(fptro,"pickbeeper();\n");
  624.                 break;
  625.              case 3:
  626.                 fprintf(fptro,"putbeeper();\n");
  627.                 break;
  628.              case 4:
  629.                 fprintf(fptro,"turnoff(0);\n");
  630.                 break;
  631.              case 5:
  632.                 fprintf(fptro,"{ \n");
  633.                 break;
  634.              case 7:
  635.                 fprintf(fptro,"\nmain(argc,argv) \n");
  636.                 fprintf(fptro,"int argc;\n");
  637.                 fprintf(fptro,"char **argv;\n");
  638.                 fprintf(fptro,"  { \n");
  639.                 fprintf(fptro,"  set_up(argv);\n");
  640.                 break;
  641.              case 8:
  642.                 fprintf(fptro,"} \n");
  643.                 break;
  644.              case 11:
  645.                 fscanf(fptri,"%d %d %d %d %d %d %d %d",&i,&in,&d,&fn,&fs,&b,&t,&l);   /* read test */
  646.                 fprintf(fptro,"if (%s)\n",test[i]);
  647.                 fscanf(fptri,"%d %d %d %d %d %d %d %d",&i,&in,&d,&fn,&fs,&b,&t,&l);   /* skip THEN */
  648.                 break;
  649.              case 13:
  650.                 fprintf(fptro,"else\n");
  651.                 break;
  652.              case 14:
  653.                 fscanf(fptri,"%d %d %d %d %d %d %d %d",&i,&in,&d,&fn,&fs,&b,&t,&l);
  654.                 fprintf(fptro,"for (%s = 0; %s < %d; %s++)\n",
  655.                         j[in],j[in],i,j[in]);
  656.                 break;
  657.              case 15:
  658.                 fscanf(fptri,"%d %d %d %d %d %d %d %d",&i,&in,&d,&fn,&fs,&b,&t,&l);
  659.                 fprintf(fptro,"while (%s)\n",test[i]);
  660.                 break;
  661.              case 16:
  662.                 fscanf(fptri,"%d %d %d %d %d %d %d %d",&i,&in,&d,&fn,&fs,&b,&t,&l);
  663.                 while ((getc(fptri)) != '\n');
  664.                 i = reloc[i] = last++;
  665.                 k = 0;
  666.                 while ((w[k++] = getc(fptri)) != '\n')
  667.                     if (w[k - 1] == '-')
  668.                        w[k - 1] = '_';
  669.                 k -= 2;
  670.                 w[k] = '\0';
  671.                 strcpy(newname[i],w); 
  672.                 fprintf(fptro,"\n%s()\n",newname[i]);
  673.                 break;
  674.              default:
  675.                 ;
  676.              }
  677.           else { 
  678.              i = reloc[i];
  679.              fprintf(fptro,"%s();\n",newname[i]);
  680.           }
  681. }
  682.